<?php

class Plugins_InternationalisationPlugin extends Plugins_StrategyPlugin {
	const ROUTE_LANGAGE = 'langage';
	const PARAMETRE_LANGAGE = 'langage';
	const PARAMETRE_LANGAGE_DEFAULT = 'default';

	public function routeStartup(Zend_Controller_Request_Abstract $request) {
		$front = Zend_Controller_Front::getInstance();
		$router = $front->getRouter();
		$router->addRoute(self::ROUTE_LANGAGE, new Zend_Controller_Router_Route(':'.self::PARAMETRE_LANGAGE.'/:controller/:action/:module/',array("controller" => "index","action" => "index","module" => "default",self::PARAMETRE_LANGAGE => self::PARAMETRE_LANGAGE_DEFAULT,)));
	}

	public function routeShutdown(Zend_Controller_Request_Abstract $request) {
		$paramLangage = $this->getLangageName();
		$locale = Manager::getLocale();
		$translate = Manager::getTranslate();

		// Pas de langue explicitement demandé (default) => redirection vers langue adéquat
		if (strcasecmp($paramLangage,self::PARAMETRE_LANGAGE_DEFAULT) == 0) {
			// Récupération de la langue adéquat (logique) pour le client
			$logicLangage = $this->getLogicCodeLangage($locale->toString());
            $locale->setLocale($logicLangage);
			// Redirection avec demande explicite de langue
//			$this->getPlugin()->getResponse()->setRedirect('/'.$logicLangage.$request->getPathInfo());
            $request
                ->setParam(self::PARAMETRE_LANGAGE, $logicLangage)
                ->setControllerName('index')
                ->setDispatched(false);
        }
		// Langue demandée disponible => changement des paramètres de localité
		else if ($translate->isAvailable($paramLangage)) {
			$locale->setLocale($paramLangage);
		}
		// Langue demandée non disponible => langage adéquat + exception de localité (error 404)
		else {
			// Récupération la langue la plus proche de celle demandée
			$logicLangage = $this->getLogicCodeLangage($paramLangage);
			// Affectation de la langue proche
			$locale->setLocale($logicLangage);
			// Enregistrement d'une exception
			Manager::saveException(new Plugins_ExceptionLangage("Language unavailable"));
		}

		// Modification de la nouvelle localité pour le système de traduction
		$translate->setLocale($locale);
		$this->addLangagesToView($request, $translate, $locale);
	}

	private function getLogicCodeLangage($paramLangage) {
		return Manager::loadCache("lang_".$paramLangage, function() use($paramLangage){
			// Récupération des langages mappés
			$codeLangage = Models_Core_LangageMap::getMapCode($paramLangage);

			// Pas de langage mappé trouvé => recherche du langage le plus proche
			if (is_null($codeLangage)) {
				$codeLangage = Models_Core_Langage::getCodeLangageProche($paramLangage);
				if (is_null($codeLangage)) {
					$codeLangage = Models_Core_LangageMap::getMapCode(Plugins_InternationalisationPlugin::PARAMETRE_LANGAGE_DEFAULT);
				}
			}
			return $codeLangage;
		});
	}

	public function getLangageName() {
		return $this->getPlugin()->getRequest()->getParam(self::PARAMETRE_LANGAGE);
	}

	public function addLangagesToView(Zend_Controller_Request_Abstract $request, Zend_Translate $translate, Zend_Locale $locale) {
		$view = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer')->view;
		$view->langages = array();
		foreach ($translate->getList() as $codeLangage) {
			if (strcmp($locale->toString(), $codeLangage) != 0) {
				array_push($view->langages, array('controller'=>$request->getControllerName(), 'action'=>$request->getActionName(), 'module'=>$request->getModuleName(), 'langage'=>$codeLangage));
			}
		}
	}
}